package controlador;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
import java.util.Date;
import modelo.Deposito;
import modelo.Drogueria;
import modelo.FacturaCompra;
import modelo.ItemCompra;
import modelo.Lote;
import modelo.Producto;
import modelo.Proveedor;
import vista.VentanaAgregarProducto;
import vista.VentanaAgregarProveedor;
import vista.VentanaCompraProveedor;
import vista.VentanaModeloCompra;

public class ControladorCompraProveedor implements ActionListener, ItemListener {

	private VentanaCompraProveedor ventanaCompraProveedor;
	private Proveedor proveedor;
	private Producto producto;
	private Deposito deposito;
	private Drogueria drogueria;
	private ItemCompra itemCompra;
	private Lote lote;
	private FacturaCompra factura;
	private VentanaAgregarProducto ventanaAgregarProducto;
	private VentanaAgregarProveedor ventanaAgregarProveedor;
	private VentanaModeloCompra ventanaModeloCompra;
	private int cont = 1;
	private ArrayList<Lote> lotes;
	private ArrayList<ItemCompra> laCompra;
	private ArrayList<Lote> elLote;
	private ArrayList<FacturaCompra> facturasCompras;

	public ControladorCompraProveedor(Drogueria drog, Deposito dep)

	{
		// TODO Auto-generated constructor stub
		super();
		ventanaCompraProveedor = new VentanaCompraProveedor();
		ventanaCompraProveedor.setLocationRelativeTo(null);
		ventanaCompraProveedor.setVisible(true);
		ventanaCompraProveedor.agregarListener(this);	
		ventanaCompraProveedor.setProveedoresComboBox(drogueria.getNombreProveedorComboBox());
		ventanaCompraProveedor.setProductosComboBox(drogueria.getNombreProductoComboBox());
		ventanaCompraProveedor.setDepositosComboBox(drogueria.getNombreDepositosComboBox());
		ventanaCompraProveedor.deshabilitarUbicar();
		this.drogueria = drog;
		this.deposito = dep;
		this.laCompra = new ArrayList<>();
		this.elLote = new ArrayList<>();
		this.lotes = new ArrayList<>();
		this.factura = new FacturaCompra();
		this.facturasCompras = new ArrayList<>();
	}

	/***********************************************************************

	 ******/

	public void actionPerformed(ActionEvent ae) {
		if (ae.getActionCommand().equalsIgnoreCase("Distribuir")) {
			ventanaCompraProveedor.habilitarUbicar();
			distribuir();
		}

		else {
			if (ae.getActionCommand().equalsIgnoreCase("Ubicar")) {
				ubicar();

			}
		}
		if (ae.getActionCommand().equalsIgnoreCase("Cancelar Ubicacion")) {
			ventanaCompraProveedor.limpiarCamposUbicar();
		}
		if (ae.getActionCommand().equalsIgnoreCase("Almacenar")) {
			almacenar();
		}
		if (ae.getActionCommand().equalsIgnoreCase("Cancelar")) {
			ventanaCompraProveedor.limpiarCampos();
		}
		if (ae.getActionCommand().equalsIgnoreCase("Salir")) {

			ventanaCompraProveedor.dispose();
		}

	}

	public void distribuir() {
		ventanaCompraProveedor.habilitarUbicar();
		ventanaCompraProveedor.deshabilitarDistribuir();
		ventanaCompraProveedor.setCantidadPen(ventanaCompraProveedor
				.getCantidad());
		ventanaCompraProveedor.setCodLote(cont);

	}

	// arreglo artificial
	public void ubicar() {

		String numeroLote = ventanaCompraProveedor.getCodLote();
		String descripcion = ventanaCompraProveedor.getNombreProducto();
		int cantLote = ventanaCompraProveedor.getCantidadUb();
		String proveedor = ventanaCompraProveedor.getProveedor();
		Date fechaVencimiento = ventanaCompraProveedor.getFecha();
		String numeroContenedor = ventanaCompraProveedor.getNumeroContenedor();
		String codigoDeposito = ventanaCompraProveedor.getCodigoDeposito();
		String estante = "Estante";
		String paleta = "Paleta";

		if (ventanaCompraProveedor.getCantidadPen() >= ventanaCompraProveedor
				.getCantidadUb()) {
			ventanaCompraProveedor.setCantidadPen(ventanaCompraProveedor
					.getCantidadPen() - ventanaCompraProveedor.getCantidadUb());
			ventanaCompraProveedor.setCodLote(cont++);

			if (ventanaCompraProveedor.getRbtEstante().isSelected()) {
				Lote lt = new Lote(numeroLote, descripcion, cantLote,
						proveedor, fechaVencimiento, estante, numeroContenedor,
						codigoDeposito);
				this.elLote.add(lt);
			} else {
				Lote lt = new Lote(numeroLote, descripcion, cantLote,
						proveedor, fechaVencimiento, paleta, numeroContenedor,
						codigoDeposito);
				this.elLote.add(lt);
			}

		} else {
			ventanaCompraProveedor
			.mostrarMensaje("Error! la cantidad a ubicar no es valida");
		}

		ventanaCompraProveedor.setDepositosComboBox(drogueria
				.getNombreDepositosComboBox());
		if (ventanaCompraProveedor.getCantidadPen() == 0) {
			ventanaCompraProveedor.mostrarMensaje("Ubicacion del Producto Completada. Puede agregar otro producto si desea ");
			for (int i = 0; i < elLote.size(); i++) {
				this.lotes.add(elLote.get(i));
			}
			ventanaCompraProveedor.mostrarMensaje("Cantidad de lotes: "
					+ this.lotes.size());
			ItemCompra ic = new ItemCompra(ventanaCompraProveedor.getNombreProducto(),
					ventanaCompraProveedor.getCantidad(),
					ventanaCompraProveedor.getFecha(), lotes);
			this.laCompra.add(ic);
			/*********************************/

			ventanaCompraProveedor
			.setListado(new VentanaModeloCompra(laCompra));
			ventanaCompraProveedor.setProductosComboBox(drogueria
					.getNombreProductoComboBox());
			this.elLote.clear();
			ventanaCompraProveedor.limpiarCampos();
			ventanaCompraProveedor.habilitarDistribuir();
			ventanaCompraProveedor.deshabilitarUbicar();
			ventanaCompraProveedor.setCodLoteVacio();
		}
		ventanaCompraProveedor.limpiarCamposUbicar();

	}

	/***********************************************************************

	 ***************************************************/

	public void almacenar() {

		ventanaCompraProveedor.mostrarMensaje("" + this.factura.canItems());

		for (int j = 0; j < laCompra.size(); j++) {
			// factura.getItemCompras().add(laCompra.get(j));
			this.factura.agregarItem(laCompra.get(j));
			// this.drogueria.agregarFacturaCompra(factura.getItemCompras().add(laCompra.get(j)));

		}
		ventanaCompraProveedor.mostrarMensaje("Antes de for cantidad de intens"
				+ factura.canItems());
		for (int k = 0; k < factura.canItems(); k++) {
			
			for (int i = 0; i < factura.getItemCompra(k).cantLotes(); i++) {
				Lote lot = factura.getItemCompra(k).getLote(i);

				int posicion = drogueria.buscarDeposito(factura
						.getItemCompra(k).getLote(i).getCodDeposito());
				String tipoContenedor = factura.getItemCompra(k).getLote(i)
						.getContenedor();

				if (tipoContenedor.equals("Paleta")) {
					int num = drogueria.getDeposito(posicion).buscarPaleta(
							factura.getItemCompra(k).getLote(i)
							.getNumContenedorInt());
					drogueria.getDeposito(posicion).getPaleta(num)
					.agregarLote(lot);

				} else {
					int num1 = drogueria.getDeposito(posicion).buscarEstante(
							factura.getItemCompra(k).getLote(i)
							.getNumContenedorInt());
					drogueria.getDeposito(posicion).getEstante(num1)
					.agregarLote(lot);
				}
				int posLinea = drogueria.buscarLineaPorDescripcionProducto(factura
								.getItemCompra(k).getLote(i).getDescripcion());
				
                  int posProd = drogueria.getLinea(posLinea).buscarProducto(
						factura.getItemCompra(k).getLote(i).getDescripcion());
                  
	drogueria.getLinea(posLinea).getProducto(posProd).setExistencia(drogueria.getLinea(posLinea).
		        	getProducto(posProd).getExistencia()+ factura.getItemCompra(k).getCantidad());
			}
		}
		ventanaCompraProveedor.mostrarMensaje("Registro Existoso");
		this.drogueria.agregarFacturaCompra(this.factura);
		lotes.clear();
	}

	@Override
	public void itemStateChanged(ItemEvent ie) {
		deposito = drogueria.getDeposito(drogueria.buscarDeposito(ventanaCompraProveedor.getCmbDepositoString()));
		if (ie.getStateChange() == ItemEvent.SELECTED) {
			if (ie.getSource() == ventanaCompraProveedor.getRbtEstante()) {
				ventanaCompraProveedor.llenarComboEstante(deposito.cantEstantes());
			} else {
				ventanaCompraProveedor.llenarComboPaleta(deposito.cantPaletas());
			}
		}
	}

}
